/*
 * CTRL_ResultadoEvaluacion.java
 *
 * Created on October 13, 2007, 11:54 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAyudantes;

import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.TipoAyudantia;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import hero.interfaces.BnNodeValue;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.Ayudantias.SolicitarAyudantes.*;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;
/**
 *
 * @author kabad
 */
public class CTRL_ResultadoEvaluacion extends CTRL_Base {

    private ResultadoEvaluacionInterface gui;
    private ActividadResultado nombreActividad;
    private String strNombreActividad;

    public enum ActividadResultado {
        SolicitudAprobada, SolicitudObservada, SolicitudRechazada
    };

    /** Creates a new instance of CTRL_ResultadoEvaluacion */
    public CTRL_ResultadoEvaluacion(ResultadoEvaluacionInterface gui,
            FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
    }

    public void inicializar() throws MensajeException {
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
            System.out.println("Instancia init: " + instancia);
        }
        gui.getPanelNavegacion().getLblNavegacion().setText(Logica.modelo_SolicitarAyudantes + " -> " + strNombreActividad);
        cargarDatos();
    }

    public void lanzarConvocatoria() throws MensajeException {
        BnNodeValue actividad;
        String nombreInstanciaProceso;
        Solicitudayudantia solicitud;
        Solicitudayudantia solicitud2;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, strNombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitud);
            Date fechaMaxregistro =gui.getFecha();
           if(!(fechaMaxregistro.compareTo(solicitud.getFechainicioayudantia()) <0))               
               throw new MensajeException("Fecha máxima recepción de solicitudes debe ser anterior a fecha inicio de la ayudantía: "+solicitud.getFechainicioayudantia());
            java.util.Date fechamod = (java.util.Date) new java.util.Date();
            solicitud.setFechamodificacion(new Date(fechamod.getTime()));            
            solicitud.setFechaMaxRegistro(gui.getFecha());
            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
           prjSession.setNodeProperty(strNombreActividad, "idSolicitudActividad", solicitud2.getIdSolicitudAyudantia() + "");
            prjSession.setProperty("fechaMaxRegistro", gui.getFecha().getTime() + "");

            solicitud.setRegistroHabilitado(true);
             solicitud.setFechamodificacion(gui.getFecha()); 
            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);// Este es una Solicitud que se usara en "Registro de Estudiantes para Ayudantia"

            prjSession.setProperty("idTempSolicitudActividad", solicitud2.getIdSolicitudAyudantia() + "");
            usrSession.startActivity(nombreInstanciaProceso, strNombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, strNombreActividad);
             //falta enviar correo masivo sobre la ayudantia 

        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_ResultadoEvaluacion.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
        }

    }

    public boolean volverSolicitar(boolean volverASolicitar) throws MensajeException {
        BnNodeValue actividad;
        String nombreInstanciaProceso;
        Solicitudayudantia solicitud;

        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, strNombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitud);
              java.util.Date fechamod = (java.util.Date) new java.util.Date();
            solicitud.setFechamodificacion(new Date(fechamod.getTime()));           
            solicitud = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            
            if (volverASolicitar) {
                prjSession.setNodeProperty(strNombreActividad, "volverASolicitar", "Si");
            } else {
                prjSession.setNodeProperty(strNombreActividad, "volverASolicitar", "No");
            }
            prjSession.setNodeProperty(strNombreActividad, "idSolicitudActividad", solicitud.getIdSolicitudAyudantia() + "");

            usrSession.startActivity(nombreInstanciaProceso, strNombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, strNombreActividad);
            return true;
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_ResultadoEvaluacion.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
       }

    }

    public boolean finalizarSolicitud() throws MensajeException {
        BnNodeValue actividad;
        String nombreInstanciaProceso;
        Solicitudayudantia solicitud;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                throw new Exception();
            }

            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, strNombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitud);

            java.util.Date fecha = (java.util.Date) new java.util.Date();
            solicitud.setFechamodificacion(new Date(fecha.getTime()));
            solicitud.setEstado("Terminada");
            solicitud = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            prjSession.setNodeProperty(strNombreActividad, "idSolicitudActividad", solicitud.getIdSolicitudAyudantia() + "");
            usrSession.startActivity(nombreInstanciaProceso, strNombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, strNombreActividad);
            // revisar si no es necesario hacer una clonacion para la actividad solicitud rechazada, por ej. puede sser necesario para mostrar en historial
            //falta enviar correo a profesor y decano.
            return true;

        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
           ex.printStackTrace();
            Logger.getLogger(CTRL_ResultadoEvaluacion.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
       }

    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        System.out.println("instancia: " + instancia);
        return instancia;
    }

    private void cargarDatos() throws MensajeException {
        String nombreInstancia;
        Solicitudayudantia solicitud;

        TipoAyudantia tipoAyudantia;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstancia = getNombreInstanciaProceso();
            if (nombreInstancia == null) {
                throw new Exception();
            }
            prjSession.initProject(nombreInstancia);
            int idSolicitud = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitud);

            tipoAyudantia = logica.leerTipoAyudantia(solicitud);
            // obtener nombre y tipo de ayudnatia

            String nombreAyudantia = "";
            if (tipoAyudantia.getTipo() == TipoAyudantiaEnum.ACADEMICA) {
                nombreAyudantia = solicitud.getMateria().getNombre();
                gui.setTitulo(nombreAyudantia);
            } else {
                nombreAyudantia = solicitud.getAyudantiavaria().getNombre();
                gui.setTitulo(nombreAyudantia);
            }


            if (solicitud.getObservacionEvaluador() == null || solicitud.getObservacionEvaluador().equals("")) {
                gui.setObservaciones("No hay observaciones");
            } else {
                gui.setObservaciones(solicitud.getObservacionEvaluador());
            }
            gui.setFechaMaxRecepcionSolicitudes(solicitud.getFechaMaxRegistro());

        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_ResultadoEvaluacion.class.getName()).log(Level.SEVERE, null, ex);
            new MensajeException("No es posible iniciar la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    public ActividadResultado getNombreActividad() {
        return nombreActividad;
    }

    public void setNombreActividad(ActividadResultado nombreActividad) {
        this.nombreActividad = nombreActividad;
        switch (nombreActividad) {
            case SolicitudAprobada:
                strNombreActividad = "Evaluacion Aprobada";
                break;
            case SolicitudObservada:
                strNombreActividad = "Evaluacion Observada";
                break;
            case SolicitudRechazada:
                strNombreActividad = "Evaluacion Rechazada";
                break;
        }

    }
}
